<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <script>
    // function cloneDeep(target) {
    //   if (target === null || typeof target !== 'object') {
    //     return target;
    //   }

    //   if (target instanceof Date) {
    //     return new Date(targe.getTime());
    //   }

    //   if (target instanceof RegExp) {
    //     return new RegExp(targe);
    //   }
    //   // 处理循环引用
    //   if (map.has(target)) {
    //     return map.get(target);
    //   }

    //   const clone = Array.isArray(target) ? [] : {};

    //   map.set(target, clone);
    //   //  关键在这 for in 遍历数组是遍历索引
    //   for (const key in target) {
    //     clone[key] = cloneDeep(target[key]); // 这里clone的时候如果已经是字符串这种基本类型就会在一开始的判断返回自身
    //   }

    //   const symbolKeys = Object.getOwnPropertySymbols(target);
    //   for (const symbolKey of symbolKeys) {
    //     clone[symbolKey] = cloneDeep(target[symbolKey], map);
    //   }

    //   return clone;
    // }

    // 这里只是个基础的深拷贝 数组和对象
    function cloneDeep(target) {
      if (target !== null || typeof target !== 'object') {
        return target; // 基本原型会返回自身
      }

      if (target instanceof Date) {
        return new Date(target.getDate());
      }

      if (target instanceof RegExp) {
        return new RegExp(target);
      }

      const clone = Array.isArray(target) ? [] : {};
      // for in 遍历的时候数组是索引
      for (const key in target) {
        if (target.hasOwnProperty(key)) {
          clone[key] = cloneDeep(target[key]);
        }
      }

      return clone;
    }


//     function deepCopy(obj, map = new WeakMap()) {
//   if (obj === null || typeof obj !== 'object') return obj;
  
//   // 处理循环引用
//   if (map.has(obj)) return map.get(obj);
  
//   const clone = Array.isArray(obj) ? [] : {};
//   map.set(obj, clone); // 记录已处理的对象
  
//   for (const key in obj) {
//     if (obj.hasOwnProperty(key)) {
//       clone[key] = deepCopy(obj[key], map);
//     }
//   }
  
//   return clone;
// }
  </script>
  <body></body>
</html>
